/* Thread.cc -- Classe para encapsular thread
 *
 * Copyright (C) 2008, Diogo F. S. Ramos <diogo.ramos@usp.br>
 * GEAR - Grupo de Estudos Avançados em Robótica
 * <http://www.sel.eesc.usp.br/gear>
 *
 * This file is part of GearIA.
 * 
 * GEARMedula is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, version 3 of the
 * License.
 * 
 * GEARMedula is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see
 * <http://www.gnu.org/licenses/>.
 */

#include "Thread.hh"

Thread::Thread()
{
}

Thread::~Thread()
{
}

int Thread::Start(void * arg)
{
    Arg(arg);
    int code = pthread_create( & thread_id_,
			       NULL,
			       Thread::EntryPoint,
			       this );
    return code;
}

void
Thread::Stop(void)
{
    void ** pthread_return;
    pthread_cancel( thread_id_ );
    pthread_join( thread_id_, pthread_return );
}

int Thread::Execute(void * arg)
{
    Run( arg );
}

/*static */
void * Thread::EntryPoint(void * pthis)
{
    Thread * pt = static_cast<Thread*>(pthis);
    pt->Run( pt->getArg() );
}
